{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7ecc7207",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:39.054750Z",
     "start_time": "2021-10-15T07:25:35.608439Z"
    }
   },
   "outputs": [],
   "source": [
    "from autogluon.tabular import TabularDataset, TabularPredictor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4a392ef1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:39.073163Z",
     "start_time": "2021-10-15T07:25:39.057522Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['sample_submission.csv',\n",
       " 'stores.csv',\n",
       " 'train.csv',\n",
       " 'test.csv',\n",
       " 'transactions.csv',\n",
       " 'oil.csv',\n",
       " 'holidays_events.csv',\n",
       " 'store-sales-time-series-forecasting.zip']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.listdir('../autox/data/grocery_sales')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6bc8546b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:45.090059Z",
     "start_time": "2021-10-15T07:25:43.156811Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "train_data = TabularDataset('../autox/data/grocery_sales/train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "21370fd8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:45.096497Z",
     "start_time": "2021-10-15T07:25:45.092044Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3000888, 6)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4ba99057",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:45.110473Z",
     "start_time": "2021-10-15T07:25:45.098077Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>date</th>\n",
       "      <th>store_nbr</th>\n",
       "      <th>family</th>\n",
       "      <th>sales</th>\n",
       "      <th>onpromotion</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>AUTOMOTIVE</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>BABY CARE</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>BEAUTY</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>BEVERAGES</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>BOOKS</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id        date  store_nbr      family  sales  onpromotion\n",
       "0   0  2013-01-01          1  AUTOMOTIVE    0.0          0.0\n",
       "1   1  2013-01-01          1   BABY CARE    0.0          0.0\n",
       "2   2  2013-01-01          1      BEAUTY    0.0          0.0\n",
       "3   3  2013-01-01          1   BEVERAGES    0.0          0.0\n",
       "4   4  2013-01-01          1       BOOKS    0.0          0.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ec3eacc4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T07:25:51.048991Z",
     "start_time": "2021-10-15T07:25:51.044797Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    }
   ],
   "source": [
    "label = 'sales'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a225cdb6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:53:41.374213Z",
     "start_time": "2021-10-15T07:25:55.725921Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Warning: Training may take a very long time because `time_limit` was not specified and `train_data` is large (3000888 samples, 500.42 MB).\n",
      "\tConsider setting `time_limit` to ensure training finishes within an expected duration or experiment with a small portion of `train_data` to identify an ideal `presets` and `hyperparameters` configuration.\n",
      "Beginning AutoGluon training ...\n",
      "AutoGluon will save models to \"agModels-kaggle_grocery_sales/\"\n",
      "AutoGluon Version:  0.2.1b20210716\n",
      "Train Data Rows:    3000888\n",
      "Train Data Columns: 5\n",
      "Preprocessing data ...\n",
      "AutoGluon infers your prediction problem is: 'regression' (because dtype of label-column == float and many unique label-values observed).\n",
      "\tLabel info (max, min, mean, stddev): (124717.0, 0.0, 357.77575, 1101.99772)\n",
      "\tIf 'regression' is not the correct problem_type, please manually specify the problem_type argument in fit() (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])\n",
      "Using Feature Generators to preprocess the data ...\n",
      "Fitting AutoMLPipelineFeatureGenerator...\n",
      "\tAvailable Memory:                    260146.78 MB\n",
      "\tTrain Data (Original)  Memory Usage: 476.41 MB (0.2% of available memory)\n",
      "\tInferring data type of each feature based on column values. Set feature_metadata_in to manually specify special dtypes of the features.\n",
      "\tStage 1 Generators:\n",
      "\t\tFitting AsTypeFeatureGenerator...\n",
      "\tStage 2 Generators:\n",
      "\t\tFitting FillNaFeatureGenerator...\n",
      "\tStage 3 Generators:\n",
      "\t\tFitting IdentityFeatureGenerator...\n",
      "\t\tFitting CategoryFeatureGenerator...\n",
      "\t\t\tFitting CategoryMemoryMinimizeFeatureGenerator...\n",
      "\t\tFitting DatetimeFeatureGenerator...\n",
      "\tStage 4 Generators:\n",
      "\t\tFitting DropUniqueFeatureGenerator...\n",
      "\tTypes of features in original data (raw dtype, special dtypes):\n",
      "\t\t('float', [])                      : 1 | ['onpromotion']\n",
      "\t\t('int', [])                        : 2 | ['id', 'store_nbr']\n",
      "\t\t('object', [])                     : 1 | ['family']\n",
      "\t\t('object', ['datetime_as_object']) : 1 | ['date']\n",
      "\tTypes of features in processed data (raw dtype, special dtypes):\n",
      "\t\t('category', [])             : 1 | ['family']\n",
      "\t\t('float', [])                : 1 | ['onpromotion']\n",
      "\t\t('int', [])                  : 2 | ['id', 'store_nbr']\n",
      "\t\t('int', ['datetime_as_int']) : 1 | ['date']\n",
      "\t7.3s = Fit runtime\n",
      "\t5 features in original data used to generate 5 features in processed data.\n",
      "\tTrain Data (Processed) Memory Usage: 99.03 MB (0.0% of available memory)\n",
      "Data preprocessing and feature engineering runtime = 8.49s ...\n",
      "AutoGluon will gauge predictive performance using evaluation metric: 'root_mean_squared_error'\n",
      "\tTo change this, specify the eval_metric argument of fit()\n",
      "Automatically generating train/validation split with holdout_frac=0.01, Train Rows: 2970879, Val Rows: 30009\n",
      "Fitting 11 L1 models ...\n",
      "Fitting model: KNeighborsUnif ...\n",
      "\t-674.3858\t = Validation root_mean_squared_error score\n",
      "\t45.88s\t = Training runtime\n",
      "\t0.42s\t = Validation runtime\n",
      "Fitting model: KNeighborsDist ...\n",
      "\t-669.4581\t = Validation root_mean_squared_error score\n",
      "\t44.47s\t = Training runtime\n",
      "\t0.34s\t = Validation runtime\n",
      "Fitting model: LightGBMXT ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 352.602\tvalid_set's rmse: 342.819\n",
      "[2000]\ttrain_set's rmse: 325.99\tvalid_set's rmse: 309.889\n",
      "[3000]\ttrain_set's rmse: 313.975\tvalid_set's rmse: 292.873\n",
      "[4000]\ttrain_set's rmse: 306.627\tvalid_set's rmse: 283.121\n",
      "[5000]\ttrain_set's rmse: 301.377\tvalid_set's rmse: 276.231\n",
      "[6000]\ttrain_set's rmse: 297.656\tvalid_set's rmse: 271.742\n",
      "[7000]\ttrain_set's rmse: 294.859\tvalid_set's rmse: 268.274\n",
      "[8000]\ttrain_set's rmse: 292.63\tvalid_set's rmse: 265.586\n",
      "[9000]\ttrain_set's rmse: 290.695\tvalid_set's rmse: 263.242\n",
      "[10000]\ttrain_set's rmse: 289.053\tvalid_set's rmse: 261.103\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-261.1026\t = Validation root_mean_squared_error score\n",
      "\t203.31s\t = Training runtime\n",
      "\t2.15s\t = Validation runtime\n",
      "Fitting model: LightGBM ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 275.782\tvalid_set's rmse: 254.779\n",
      "[2000]\ttrain_set's rmse: 258.726\tvalid_set's rmse: 243.445\n",
      "[3000]\ttrain_set's rmse: 249.606\tvalid_set's rmse: 239.491\n",
      "[4000]\ttrain_set's rmse: 243.44\tvalid_set's rmse: 237.24\n",
      "[5000]\ttrain_set's rmse: 238.486\tvalid_set's rmse: 235.784\n",
      "[6000]\ttrain_set's rmse: 234.899\tvalid_set's rmse: 235.489\n",
      "[7000]\ttrain_set's rmse: 231.794\tvalid_set's rmse: 234.936\n",
      "[8000]\ttrain_set's rmse: 228.391\tvalid_set's rmse: 235.084\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-234.8602\t = Validation root_mean_squared_error score\n",
      "\t129.65s\t = Training runtime\n",
      "\t0.44s\t = Validation runtime\n",
      "Fitting model: RandomForestMSE ...\n",
      "\tWarning: Reducing model 'n_estimators' from 300 -> 252 due to low memory. Expected memory usage reduced from 17.79% -> 15.0% of available memory...\n",
      "\t-237.4138\t = Validation root_mean_squared_error score\n",
      "\t230.05s\t = Training runtime\n",
      "\t1.96s\t = Validation runtime\n",
      "Fitting model: CatBoost ...\n",
      "\t-273.7772\t = Validation root_mean_squared_error score\n",
      "\t804.28s\t = Training runtime\n",
      "\t0.05s\t = Validation runtime\n",
      "Fitting model: ExtraTreesMSE ...\n",
      "\tWarning: Reducing model 'n_estimators' from 300 -> 236 due to low memory. Expected memory usage reduced from 19.04% -> 15.0% of available memory...\n",
      "\t-241.7983\t = Validation root_mean_squared_error score\n",
      "\t87.35s\t = Training runtime\n",
      "\t2.33s\t = Validation runtime\n",
      "Fitting model: NeuralNetFastAI ...\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 10010). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at  /pytorch/c10/cuda/CUDAFunctions.cpp:115.)\n",
      "  return torch._C._cuda_getDeviceCount() > 0\n",
      "\t-419.781\t = Validation root_mean_squared_error score\n",
      "\t3947.66s\t = Training runtime\n",
      "\t0.49s\t = Validation runtime\n",
      "Fitting model: XGBoost ...\n",
      "\t-238.3026\t = Validation root_mean_squared_error score\n",
      "\t2888.03s\t = Training runtime\n",
      "\t0.15s\t = Validation runtime\n",
      "Fitting model: NeuralNetMXNet ...\n",
      "\tWarning: Exception caused NeuralNetMXNet to fail during training... Skipping this model.\n",
      "\t\tLegacy mxnet==1.4.0 detected, some new modules will not work properly. mxnet>=1.6.0 is required. You can use pip to upgrade mxnet `pip install mxnet --upgrade` or `pip install mxnet_cu101 --upgrade`\n",
      "Detailed Traceback:\n",
      "Traceback (most recent call last):\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/trainer/abstract_trainer.py\", line 960, in _train_and_save\n",
      "    model = self._train_single(X, y, model, X_val, y_val, **model_fit_kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/trainer/abstract_trainer.py\", line 932, in _train_single\n",
      "    model = model.fit(X=X, y=y, X_val=X_val, y_val=y_val, **model_fit_kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/core/src/autogluon/core/models/abstract/abstract_model.py\", line 518, in fit\n",
      "    out = self._fit(**kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/models/tabular_nn/tabular_nn_model.py\", line 168, in _fit\n",
      "    try_import_mxnet()\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/core/src/autogluon/core/utils/try_import.py\", line 40, in try_import_mxnet\n",
      "    raise ValueError(msg)\n",
      "ValueError: Legacy mxnet==1.4.0 detected, some new modules will not work properly. mxnet>=1.6.0 is required. You can use pip to upgrade mxnet `pip install mxnet --upgrade` or `pip install mxnet_cu101 --upgrade`\n",
      "Fitting model: LightGBMLarge ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 241.526\tvalid_set's rmse: 241.263\n",
      "[2000]\ttrain_set's rmse: 223.268\tvalid_set's rmse: 237.262\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-236.9584\t = Validation root_mean_squared_error score\n",
      "\t52.5s\t = Training runtime\n",
      "\t0.3s\t = Validation runtime\n",
      "Fitting model: WeightedEnsemble_L2 ...\n",
      "\t-219.0209\t = Validation root_mean_squared_error score\n",
      "\t0.87s\t = Training runtime\n",
      "\t0.0s\t = Validation runtime\n",
      "AutoGluon training complete, total runtime = 8865.4s ...\n",
      "TabularPredictor saved. To load, use: predictor = TabularPredictor.load(\"agModels-kaggle_grocery_sales/\")\n"
     ]
    }
   ],
   "source": [
    "save_path = 'agModels-kaggle_grocery_sales'  # specifies folder to store trained models\n",
    "predictor = TabularPredictor(label=label, path=save_path).fit(train_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fa84c4eb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:53:41.398929Z",
     "start_time": "2021-10-15T09:53:41.377333Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n",
      "Loaded data from: ../autox/data/grocery_sales/test.csv | Columns = 5 / 5 | Rows = 28512 -> 28512\n"
     ]
    }
   ],
   "source": [
    "test_data_nolab = TabularDataset('../autox/data/grocery_sales/test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "54cce4ce",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:13.936797Z",
     "start_time": "2021-10-15T09:53:41.401192Z"
    }
   },
   "outputs": [],
   "source": [
    "y_pred = predictor.predict(test_data_nolab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ca6cc9bf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:13.960422Z",
     "start_time": "2021-10-15T09:55:13.940972Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0           82.480957\n",
       "1            2.751145\n",
       "2            9.633842\n",
       "3        11503.893555\n",
       "4            2.019032\n",
       "             ...     \n",
       "28507      826.900085\n",
       "28508      112.789024\n",
       "28509     2959.183105\n",
       "28510      226.390732\n",
       "28511       80.099251\n",
       "Name: sales, Length: 28512, dtype: float32"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "240cd16c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:13.965456Z",
     "start_time": "2021-10-15T09:55:13.962454Z"
    }
   },
   "outputs": [],
   "source": [
    "id_ = ['id']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b4fd354e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:13.988247Z",
     "start_time": "2021-10-15T09:55:13.967527Z"
    }
   },
   "outputs": [],
   "source": [
    "sub = test_data_nolab[id_].copy()\n",
    "sub[label] = list(y_pred.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c59b336a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:14.129758Z",
     "start_time": "2021-10-15T09:55:13.990301Z"
    }
   },
   "outputs": [],
   "source": [
    "sub.to_csv(\"./autogluon_sub_kaggle_grocery_sales.csv\", index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c43926aa",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-15T09:55:14.133933Z",
     "start_time": "2021-10-15T09:55:14.131948Z"
    }
   },
   "outputs": [],
   "source": [
    "# !zip -r autogluon_sub_kaggle_ventilator.csv.zip autogluon_sub_kaggle_ventilator.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b54628e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
